#ifndef LZP_H_
#define LZP_H_
#include "Indice.h"
#include "ManejadorDeArboles.h"

#define TAM_BLOQUE 16384000//4096000

class LZP {
private:

	char bloque[TAM_BLOQUE];
	int posicionDeInicioDelBloque;
	int posicionActualDeProcesoDentroDelBloque;
	bool buscarFueraDeLaVentana;
	char contextoCompresion;
	char primerCaracterQueNoMatchea;

	char vectorContexto[2];
	char charLecturaEnBuscaDeMatch[1];
	char* bufferMatchFueraDeVentana;
	char anteultimoCaracterDelBLoqueAnterior;
	char ultimoCaracterDelBLoqueAnterior;
	int posicionActualdeProceso;
	ifstream* archivoEntrada;
	fstream* archivoSalida;
	int cantidadBloques;
	int bytesRestantes;
	Indice* indice;
	ManejadorDeArboles* manejador;
	void recibirCaracterConContexto1();
	void recibirCaracterSinContexto();
	void codificarLongitud(int limitePorDerecha);
	void recibirDupla();
	int calcularLongitudMatch(int posicionMatch,int limite);
	void codificarCaracterSinContexto(unsigned char caracter);
	void codificarCaracterConContexto1(unsigned char caracter);
	void codificarDupla(int limite);
	bool posicionFueraDeLaVentana(int posicion);
	bool hayMatch(int posMatchTabla,int posMatchActual);
	void emitirLongitudDeMatch(int longMatch);
	int recibirLongitudDeMatch();
	bool esPosicionValida(int posicionDelMatch);
	void obtenerMatch(int longitudDelMatch);
	void establecerContexto();

public:
	LZP(int tamanoArchivo);
	virtual ~LZP();
	void comprimir(string rutaArchivoEntrada, BitHandlerOutput &pbho);
	void descomprimir(string rutaArchivoSalida, BitHandlerInput &pbhi);
};

#endif /*LZP_H_*/
